397. 整数替换

397. 整数替换

Similar Question

Solution Tips

方案一: Dfs + 记忆

pC819sI.png

这里的一个数学知识点, 为了防止溢出, 使用的方法非常巧妙

var integerReplacement = function(n) {
    if (n === 1) {
        return 0;
    }
    if (n % 2 === 0) {
        return 1 + integerReplacement(Math.floor(n / 2));
    }
    return 2 + Math.min(integerReplacement(Math.floor(n / 2)), integerReplacement(Math.floor(n / 2) + 1));
};

我们给方法一的递归加上记忆化,这样递归树的每一层最多只会计算两个 n 值,时间复杂度降低为 O(logn)。

主要节省的就是 Math.min() 里的计算, 因为这两个数相差的不大, 所以难免会有很多重复的计算.

const memo = new Map();
var integerReplacement = function(n) {
    if (n === 1) {
        return 0;
    }
    if (!memo.has(n)) {
        if (n % 2 === 0) {
            memo.set(n, 1 + integerReplacement(Math.floor(n / 2)));
        } else {
            memo.set(n, 2 + Math.min(integerReplacement(Math.floor(n / 2)), integerReplacement(Math.floor(n / 2) + 1)));
        }
    }
    return memo.get(n);
};

方案二: 方案一的动态规划解释

pC81gld.png

代码一摸一样, 只是站在了不同的角度去理解这段代码

方案三: 贪心思想

我觉得太难理解了, 想进阶可以去看题解